package br.com.furb.trabalhoFinal.model;

import br.com.furb.trabalhoFinal.Exceptions.ColaboradorException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Colaborador implements Serializable {

    private int numeroCadastro;
    private String nome;
    private Date dataNasc;
    private Cargo cargo;
    private List<Lancamento> lancamentos;
    private Map<Date, Marcacoes> marcacoes;
    private double salario;
    private String senha;

  public String getSenha() {
    return senha;
  }

  public void setSenha(String senha) {
    this.senha = senha;
  }

    public Colaborador(int numeroCadastro, String nome, Date dataNasc, Cargo cargo,
            Map<Date, Marcacoes> marcacoes, double salario, List<Lancamento> lancamentos) {
        super();
        this.numeroCadastro = numeroCadastro;
        this.nome = nome;
        this.dataNasc = dataNasc;
        this.cargo = cargo;
        this.lancamentos = lancamentos;
        this.marcacoes = marcacoes;
        this.salario = salario;
    }

    public Colaborador() {
        lancamentos = new ArrayList<Lancamento>();
        marcacoes = new HashMap<Date, Marcacoes>();
    }

    public int getNumeroCadastro() {
        return numeroCadastro;
    }

    public void setNumeroCadastro(int numeroCadastro) throws ColaboradorException {
        if (numeroCadastro < 0) {
            throw new ColaboradorException("Número do cadastro não pode ser menor do que zero");
        }
        this.numeroCadastro = numeroCadastro;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) throws ColaboradorException {
        if (nome == null || nome.isEmpty()) {
            throw new ColaboradorException("Nome inválido");
        }
        this.nome = nome;
    }

    public Date getDataNasc() {
        return dataNasc;
    }

    public void setDataNasc(Date dataNasc) {
        this.dataNasc = dataNasc;
    }

    public Cargo getCargo() {
        return cargo;
    }

    public void setCargo(Cargo cargo) throws ColaboradorException {
        if (cargo == null) {
            throw new ColaboradorException("Cargo vazio");
        }
        this.cargo = cargo;
    }

    public Map<Date, Marcacoes> getMarcacoes() {
        return marcacoes;
    }

    public void setMarcacoes(Map<Date, Marcacoes> marcacoes) {
        this.marcacoes = marcacoes;
    }

    public double getSalario() {
        return salario;
    }

    public void setSalario(double salario) throws ColaboradorException {
        if (salario < 0) {
            throw new ColaboradorException("Salário menor que zero");
        }
        this.salario = salario;
    }

    public List<Lancamento> getLancamentos() {
        return lancamentos;
    }

    public void addLancamento(Lancamento lancamento) {
        lancamentos.add(lancamento);
    }

    public void addAllLancamentos(List<Lancamento> lancamentos) {
        lancamentos.addAll(lancamentos);
    }

    @Override
    public boolean equals(Object colaborador) {
        if (!(colaborador instanceof Colaborador)) {
            return false;
        }
        Colaborador other = (Colaborador) colaborador;
        Boolean ret;
        ret = getCargo().equals(other.getCargo());
        ret &= getDataNasc().getTime() == other.getDataNasc().getTime();
        for (Map.Entry<Date, Marcacoes> entry : marcacoes.entrySet()) {
            Date date = entry.getKey();
            Marcacoes marcacoes1 = entry.getValue();
            ret &= marcacoes1.equals(other.getMarcacoes().get(date));
        }
        ret &= getNome().equals(other.getNome());
        ret &= getSalario() == other.getSalario();
        return ret;
    }
}
